import cv2
import os
import numpy as np
from pojo.File import File


# 读取图片
def pdtpsfxs_判断图片是否相似(
    # img1_path, img2_path, tzdsl_特征点数量=10, sfksh_是否可视化=False
    file_img1: File,
    file_img2: File,
    tzdsl_特征点数量=30,
    sfksh_是否可视化=False,
):
    if (file_img1.get_file_path() is None) or (file_img2.get_file_path() is None):
        return False
    img1 = cv2.imdecode(np.fromfile(file_img1.get_file_path(), dtype=np.uint8), 0)
    img2 = cv2.imdecode(np.fromfile(file_img2.get_file_path(), dtype=np.uint8), 0)

    # 使用ORB检测出特征点
    orb = cv2.ORB_create(nfeatures=1000)  # nfeatures 代表着找到多少个特征点
    kp1, des1 = orb.detectAndCompute(
        img1, None
    )  # kp : key points  des : descriptor  (key points：特征点在图像中的位置，有些特征点还具有朝向、大小等信息。 描述子：通常是一个向量，描述了该关键点周围像素的信息)
    kp2, des2 = orb.detectAndCompute(img2, None)

    # 绘制出检测得到的特征点
    # imgKp1 = cv2.drawKeypoints(img1, kp1, None)
    # imgKp2 = cv2.drawKeypoints(img2, kp2, None)

    # match两张图片中的特征点
    bf = cv2.BFMatcher()
    # print(type(des1), type(des2))
    # print(img2, type(img2), img2_path)
    if img1 is None or img2 is None:
        return False
    matches = bf.knnMatch(des1, des2, k=2)

    good = []
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append([m])
    # print(len(good))  # 打印出匹配到了多少个特征点
    if sfksh_是否可视化:
        # 在一张新的图片上展示match的结果
        img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
        # 展示结果
        cv2.imshow("match", img3)
        cv2.waitKey(0)
    bl = len(good) >= tzdsl_特征点数量
    # print("cv2  49  " + str(bl) + str(len(good)))
    return bl
